﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "GcmpGeometryInterface.h"
#include "NdbObjectCloneable.h"

#include "GeometryType.h"
#include "GeometryVersion.h"

namespace ggp
{
    class CGeometry;
}

namespace gcmp
{
    class Box3d;
    class Vector3d;
    class Matrix4d;
    class IIOStream;

    /// \brief 几何对象基类
    ///
    class IGeometry : public NdbObjectCloneable
    {
    public:
        /// \brief  根据字符串建立新的几何对象
        /// \param string 字符串
        /// \return 几何对象
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<IGeometry> CreateFromString(const std::wstring &string);

        /// \brief     根据二进制流建立新的几何对象
        /// \param archive 二进制流
        /// \return    几何对象
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<IGeometry> CreateFromStream(IIOStream & ioStream);

        /// \brief     根据二进制流化数据建立新的几何对象
        /// \param bytes 二进制流化数据
        /// \return    几何对象
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<IGeometry> CreateFromStreamData(const std::vector<Byte>& bytes);

        /// \brief  根据数据建立新的几何对象
        /// \param  data 数据首地址
        /// \return 几何对象
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<IGeometry> CreateFromData(const char * pData);
    public:

        /// \brief  几何对象的拷贝
        /// \return 拷贝后的几何对象
        virtual OwnerPtr<IGeometry> Clone() const = 0;

        /// \brief  获取包围盒
        /// \return  返回包围盒
        virtual Box3d GetBox() const = 0;
        
        /// \brief 几何对象的位置空间变换
        /// \param  transformMatrix 变换矩阵
        /// \return 在二维变换矩阵为正交且为等比缩放矩阵，同时缩放比例不为零时返回true,否则返回false
        virtual bool Transform(const Matrix4d& transformMatrix) = 0;
        
        /// \brief 平移几何对象的位置
        /// \param offset 平移向量
        /// \return 成功返回true,否则返回false
        virtual bool Translate(const Vector3d& offset) = 0;

        /// \brief  获取几何对象的类型
        /// \return 几何类型
        virtual GeometryType GetType() const = 0;

        /// \brief  获取几何对象的二进制流化数据
        /// \param[out] bytes 二进制流化数据
        /// \return 成功返回true,否则返回false
        virtual bool GetStreamData(std::vector<Byte> &bytes) const = 0;

        /// \brief  获取几何对象的二进制流化数据
        /// \param[in] geoVersion 几何库版本
        /// \param[out] bytes 二进制流化数据
        /// \return 成功返回true,否则返回false
        virtual bool GetStreamData(GeometryVersion geoVersion, std::vector<Byte> &bytes) const = 0;

        /// \brief  获取几何对象的调试字符串(几何调试函数)
        /// \return 字符串
        virtual std::wstring GetStringForDebug()const = 0;

    public:
        virtual ~IGeometry() {};





    //TODO:liy-an 待删除.目前约束结算中仍在使用GgpGeometryTranslatorForFamily
    ///现在还有另一个使用：机电导出GFC几何时会调用该方法
    public:
        virtual ggp::CGeometry* GetGeometry() const = 0;
    };
}

